#include "jserialport.h"
#include "ui_jserialport.h"
#include <QInputDialog>
JSerialPort::JSerialPort(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::JSerialPort)
{
    ui->setupUi(this);
    ui->tshi->clear();//清空提示信息
    on_pushButton_2_clicked(); //程序打开就需要刷新串口
    ui->ascii->setChecked(true); //默认就是设置为ASCII 接收
    ui->ascii2->setChecked(true);//发送

}

JSerialPort::~JSerialPort()
{
    delete ui;

}

//刷新串口
void JSerialPort::on_pushButton_2_clicked()
{
    //获取串口名，并加入
    /*
    1,清空串口
    2、遍历串口信息
    */
    ui->id->clear(); //id为控件名
    foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
    {
        ui->id->addItem(info.portName());//加入到当前串口
    }
}



//void JSerialPort::on_id_activated(int index)
//{
//    //打开串口，并提示
//    m_serial.setPortName(ui->id->currentText());//获取当前串口名
//    m_serial.setBaudRate(ui->id->currentText().toInt());

//    //打开
//    m_serial.open(QIODevice::ReadWrite);//读写模式
//    if(m_serial.isOpen())
//    {

//        ui->tshi->setText("串口打开成功");
//        connect(&m_serial,&QSerialPort::readyRead,this,&JSerialPort::mseilainfodis());
//    }
//    else ui->tshi->setText("串口打开失败");
//}


//打开串口
void JSerialPort::on_pushButton_4_clicked()
{
    //打开串口，并提示
    m_serial.setPortName(ui->id->currentText());//获取当前串口名
//    m_serial.setBaudRate(ui->botelv_2->currentText().toInt());//波特率
//    m_serial.setDataBits(QSerialPort::Data8);//数据位

    //打开
    m_serial.open(QIODevice::ReadWrite);//读写模式
    if(m_serial.isOpen())
    {

        ui->tshi->setText("串口打开成功");

        //波特率,设置串口的
        on_botelv_2_activated(ui->botelv_2->currentIndex()); //获取下拉选择框的值
        //数据位
        on_shujuwei_2_activated(ui->shujuwei_2->currentText().toInt());
//        m_serial.setDataBits(QSerialPort::Data7);
        //停止位
        on_tingzhi_activated(ui->tingzhi->currentText().toInt());
        on_yingjianliu_2_activated(ui->yingjianliu_2->currentIndex());

        connect(&m_serial,&QSerialPort::readyRead,this,&JSerialPort::mseilainfodis);


    }
    else ui->tshi->setText("串口打开失败");
}

//关闭串口
void JSerialPort::on_pushButton_3_clicked()
{
    m_serial.close();
    if(m_serial.isOpen())
    {

        ui->tshi->setText("串口关闭失败");

    }
    else
    {
    ui->tshi->setText("串口关闭成功");
    ui->id->clear();//清除串口号
    }
}
//串口接收信息处理函数
void JSerialPort::mseilainfodis()
{
//    QByteArray arry=m_serial.readAll();//读取串口上的所有数据
//    ui->plainTextEdit->insertPlainText(arry);//显示在对话框

    QByteArray arry = m_serial.readAll(); //读取串口上的所有数据
    if (ui->radioButton_2->isChecked()) //按下radioButton_2 hex
    {
    QString hexStr = arry.toHex(); //将 QByteArray 转换为十六进制的字符串
    ui->plainTextEdit->insertPlainText(hexStr); //显示十六进制字符串在对话框
    }
    else {
      ui->plainTextEdit->insertPlainText(arry);//显示在对话框
    }
//    QString str = QString::fromUtf8(arry); // 将 QByteArray 转换为 QString
//    // 对 str 进行相应的处理，如显示在界面上、保存到文件中等
//    if (ui->radioButton_2->isChecked()) //按下radioButton_2 hex
//    {
//    QString hexStr = arry.toHex(); // 将 QByteArray 转换为十六进制的字符串
//    QByteArray hexData = QByteArray::fromHex(hexStr.toUtf8()); // 将十六进制的字符串转换为 QByteArray
//    // 对 hexData 进行相应的处理，如显示在界面上、保存到文件中等
//    ui->plainTextEdit->insertPlainText(hexData); // 在界面上显示hexData
//    }
//    else
//    ui->plainTextEdit->insertPlainText(arry);//显示在对话框
}

//清除接收对话框中内容
void JSerialPort::on_pushButton_5_clicked()
{
    ui->plainTextEdit->clear();//清空消息
}



//点击发送
void JSerialPort::on_bsend_clicked()
{
    QByteArray arry2=ui->psend->toPlainText().toUtf8();

    if (ui->hex2->isChecked()) //按下 hex
    {
      QString hexStr = arry2.toHex(); //将 QByteArray 转换为十六进制的字符串
      m_serial.write(hexStr.toLatin1().data());
    }
    else
       m_serial.write(arry2);
}


void JSerialPort::on_botelv_2_activated(int index)
{
    QString BaudRateString;
    //波特率选择
    if(ui->botelv_2->currentText().toInt()==115200)
    {
    m_serial.setBaudRate(QSerialPort::Baud115200);
    }
    if (ui->botelv_2->currentText() == QString::number(9600))
    {
    m_serial.setBaudRate(QSerialPort::Baud9600);
    }
    // ui->botelv_2->addItem("coust");
   if (ui->botelv_2->currentText() == BaudRateString)
    {
        qint32 baudRate = BaudRateString.toInt();
        m_serial.setBaudRate(baudRate);
    }
    if(ui->botelv_2->currentText() == "coust")
    {
        bool ok;
        QString baudRateString = QInputDialog::getText(this, "Custom Baud Rate", "Enter custom baud rate:", QLineEdit::Normal, "", &ok);

        if (ok && !baudRateString.isEmpty())
        {
            bool conversionOk;
            qint32 customBaudRate = baudRateString.toInt(&conversionOk);

            if (conversionOk)
            {
                m_serial.setBaudRate(customBaudRate);
                // ui->botelv_2->addItem(baudRateString);
                BaudRateString=baudRateString;
            }
            else
            {
                qDebug() << "Invalid custom baud rate entered!";
            }
        }
        else
        {
            qDebug() << "Custom baud rate input canceled!";
        }
    }
}


void JSerialPort::on_shujuwei_2_activated(int index)
{
    //数据位
    if(ui->shujuwei_2->currentText().toInt()==8)
    m_serial.setDataBits(QSerialPort::Data8);
    if(ui->shujuwei_2->currentText().toInt()==7)
    m_serial.setDataBits(QSerialPort::Data7);
}


void JSerialPort::on_tingzhi_activated(int index)
{
    //停止位
    if(ui->tingzhi->currentText().toInt()==1)
         m_serial.setStopBits(QSerialPort::OneStop);
    if(ui->tingzhi->currentText().toInt()==2)
         m_serial.setStopBits(QSerialPort::TwoStop);
    if(ui->tingzhi->currentText().toInt()==1.5f)
         m_serial.setStopBits(QSerialPort::OneAndHalfStop);
}

void JSerialPort::on_ascii_clicked(bool checked) //ASCII
{
     //点击ascii  默认是ASCII模式
    ui->ascii->setChecked(true);

}
void JSerialPort::on_radioButton_2_clicked(bool checked) //hex
{
    QByteArray arry=m_serial.readAll();//读取串口上的所有数据
//    ui->ascii2->setChecked(true);
//    if (ui->radioButton_2->isChecked())
//    {
//         QString hexStr = arry.toHex(); // 将 QByteArray 转换为十六进制的字符串
//         QByteArray hexData = QByteArray::fromHex(hexStr.toUtf8()); // 将十六进制的字符串转换为 QByteArray
//         ui->plainTextEdit->setPlainText(hexData); // 在界面上显示hexData
//    }
}


void JSerialPort::on_yingjianliu_2_activated(int index)
{
   //硬件流
    if(ui->yingjianliu_2->currentText()=="none")
         m_serial.setFlowControl(QSerialPort::NoFlowControl);
    else
             m_serial.setFlowControl(QSerialPort::HardwareControl);
}

